<h2>命名规范</h2>
<p>控制器名称为 父类名+类名组成，如 <code>SystemContentController.php</code>，<code>System</code>为父类名，<code>Content</code>为功能名，控制器中只可以有一种继承类则不需要父类名，如<code>ContentController.php</code>针对于web站点的前台内容控制器，方法名称请使用常用单词，如示例文件。</p>

<h2>基础控制器</h2>
<p>任何控制器父类都必须继承 <code>\app\base\controller\BaseController</code> 控制器，<code>Base</code>控制器继承了框架中的控制器。</p>
<h3>继承方法</h3>
<p>获取HTML模板渲染数据</p>
<pre>
/**
* 模板渲染
* @param  string $html HTML数据
* @return string       渲染HTML
*/
$this->show($html = null);
</pre>
<p>错误提示，自适应返回json数据或者直接跳转</p>
<pre>
/**
* 错误提示
* @param  string $msg  错误消息
* @param  string $url  返回地址
* @return mixed
*/
$this->error($msg, $url = null);
</pre>
<p>成功提示，自适应返回json数据或者直接跳转</p>
<pre>
/**
* 成功提示
* @param  string $msg  错误消息
* @param  string $url  返回地址
* @return mixed
*/
$this->success($msg, $url = null);
</pre>
<p>AJAX返回，返回json数组</p>
<pre>
/**
* AJAX返回
* @param array $data 数组
* @return json
*/
$this->ajaxReturn($data);
</pre>
<p>404页面不存在，跳转到404页面</p>
<pre>
/**
* 404页面不存在
*/
$this->error404();
</pre>
<h3>常量定义</h3>
<p>Base控制器可用的常量定义</p>
<pre>
APP_PATH  //APP路径 "./app/"
DATA_PATH //data路径 "./data/"
IS_GET    //判断GET提交
IS_POST   //判断POST提交
IS_AJAX   //判断AJAX提交
</pre>
<h2>系统控制器</h2>
<p>系统控制器为开发框架的核心部分，封装了登录验证、数据返回、模板嵌套等多种操作方法，一般用于站点后台、管理系统等模块控制器的继承。</p> 
<p>需要继承 <code>app\system\controller\SystemController</code> 控制器。</p>
<h3>继承方法</h3>
<p>输出模板视图</p>
<pre>
/**
* 当前用户信息
*/
$this->loginUserInfo;

/**
* 系统模板输出 - 使用框架布局
* @param  string $tpl 模板名称，留空为方法名
* @return void
*/
$this->systemDisplay($tpl = '');
</pre>
<h3>常量定义</h3>
<p>System控制器可用的常量定义</p>
<pre>
SYSTEM_ID  //登录用户id
</pre>
<h3>参数定义</h3>
<p>每个模块需要定义一下基本方法</p>
<pre>
/**
* 当前模块参数
*/
protected function _infoModule(){
    return array(
        'info'  => array(
            'name' => '模块名',
            'description' => '模块描述',
            ),
        //菜单数组
        'menu' => array(
                array(
                    'name' => '模块列表',    //菜单名
                    'url' => url('index'),  //菜单链接
                    'icon' => 'list',       //菜单图标
                ),
            ),
        //添加数组
        'add' => array(
                array(
                    'name' => '添加信息',   //按钮名
                    'url' => url('add'),   //链接地址
                ),
            ),
        );
}
</pre>

<h2>增删查改封装使用</h2>
<p><code>System</code>控制器中封装了增删查改的常用控制器代码，只需要定义少量代码即可生成控制器，下面为自动封装的操作。</p>
<pre>
/**
* 列表页
*/
public function index()

/**
* 添加
*/
public function add()

/**
* 编辑，需要get.id数据
*/
public function edit()

/**
* 删除，需要post.id数据
*/
public function del()

/**
* ajax修改,需要post.id、field、val数据
*/
public function editAjax()
</pre>
<h3>列表参数</h3>
<pre>
/**
* 操作模型名
*/
protected $_model = '模型名';

/**
* 关闭列表，返回false，默认为开启
* @return boolan
*/
protected function _index ()

/**
* 列表url参数，默认自动获取
* @return array
*/
protected function _indexUrlParam ()

/**
* 数据条件参数，默认自动根据URL获取
* @return array
*/
protected function _indexDataWhere ($pageMaps)

/**
* 分页数量，默认20条
* @return number
*/
protected function _indexDataPage ($pageMaps)

/**
* 数据排序，默认无排序
* @return string
*/
protected function _indexDataOrder ($pageMaps)

/**
* 分页数据，默认获取
* @return number
*/
protected function _indexData ($where, $pageLimit, $order)

/**
* 模板赋值，默认无
* @return array
*/
protected function _indexAssign ($pageMaps)

</pre>

<h3>增加参数</h3>
<pre>
/**
* 关闭添加，返回false，默认为开启
* @return boolan
*/
protected function _add ()

/**
* 逻辑判断
* @return void
*/
protected function _addLogic ()

/**
* 模板赋值，默认无
* @return array
*/
protected function _addAssign ()

/**
* 添加前操作
* @return array
*/
protected function _addBefore ()
/**
* 添加后操作
* @return void
*/
protected function _addAfter ($id)

</pre>

<h3>编辑参数</h3>
<pre>
/**
* 关闭编辑，返回false，默认为开启
* @return boolan
*/
protected function _edit ()

/**
* 逻辑判断
* @return void
*/
protected function _editLogic ()

/**
* 获取信息
* @return array
*/
protected function _editInfo ()

/**
* 模板赋值，默认无
* @return array
*/
protected function _editAssign ()

/**
* 编辑前操作，返回写入数据
* @return array
*/
protected function _editBefore ()

/**
* 编辑后操作
* @return void
*/
protected function _editAfter ($id)

</pre>

<h3>AJAX编辑参数</h3>
<pre>
/**
* 编辑前操作
* @return void
*/
protected function _editAjaxBefore ($id, $field, $val)

/**
* 编辑后操作
* @return void
*/
protected function _editAjaxAfter ($id, $field, $val)
</pre>

<h3>删除参数</h3>
<pre>
/**
* 删除前操作
* @return array
*/
protected function _delBefore ($id)

/**
* 编删除后操作
* @return void
*/
protected function _delAfter ($id)
</pre>

<h2>原始操作示例</h2>
<p>
包含列表、添加编辑、删除操作
</p>
<pre>
&lt;?php
namespace app\system\controller;
use app\system\controller\SystemController;
/**
 * 示例控制器
 */
class SystemUserController extends SystemController {

    /**
     * 当前模块参数
     */
    protected function _infoModule(){
        return array(
            'info'  => array(
                'name' => '示例控制器',
                'description' => '这是一个控制器示例',
                ),
            'menu' => array(
                    array(
                        'name' => '信息列表',
                        'url' => url('index'),
                        'icon' => 'list',
                    ),
                ),
            'add' => array(
                    array(
                        'name' => '添加信息',
                        'url' => url('add'),
                    ),
                ),
            );
    }
	/**
     * 列表
     */
    public function index(){
        //筛选条件
        $where = array();
        $keyword = request('request.keyword','');
        if(!empty($keyword)){
            $where['title'] = $keyword;
        }
        //URL参数
        $pageMaps = array();
        $pageMaps['keyword'] = $keyword;
        //查询数据
        $list = target('Demo')->page(20)->loadList($where,$limit);
        $this->pager = target('Demo')->pager;
        //模板传值
        $this->assign('list',$list);
        $this->assign('page',$this->getPageShow($pageMaps));
        $this->assign('pageMaps',$pageMaps);
        $this->systemDisplay();
    }

    /**
     * 增加
     */
    public function add(){
        if(!IS_POST){
            $this->systemDisplay('info');
        }else{
            if(target('Demo')->saveData('add')){
                $this->success('信息添加成功！');
            }else{
                $msg = target('Demo')->getError();
                if(empty($msg)){
                    $this->error('信息添加失败');
                }else{
                    $this->error($msg);
                }
            }
        }
    }

    /**
     * 修改
     */
    public function edit(){
        if(!IS_POST){
            $userId = request('get.user_id',0,'intval');
            if(empty($userId)){
                $this->error('参数不能为空！');
            }
            //获取记录
            $model = target('SystemUser');
            $info = $model->getInfo($userId);
            if(!$info){
                $this->error($model->getError());
            }
            $this->assign('info',$info);
            $this->systemDisplay('info');
        }else{
            if(target('Demo')->saveData('edit')){
                $this->success('信息修改成功！');
            }else{
                $msg = target('Demo')->getError();
                if(empty($msg)){
                    $this->error('信息修改失败');
                }else{
                    $this->error($msg);
                }
            }
        }
    }

    /**
     * 删除
     */
    public function del(){
        $id = request('post.data');
        if(empty($id)){
            $this->error('参数不能为空！');
        }
        if(target('Demo')->delData($id)){
            $this->success('删除成功！');
        }else{
            $msg = target('Demo')->getError();
            if(empty($msg)){
                $this->error('删除失败！');
            }else{
                $this->error($msg);
            }
        }
    }
</pre>

<script>
    Do.ready('pre', function () {
        $("pre").addClass("prettyprint");
        prettyPrint();
    });
</script>
